package com.demo.config.Segment;

import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.ansj.app.keyword.KeyWordComputer;
import org.ansj.app.keyword.Keyword;
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.BaseAnalysis;
import org.ansj.splitWord.analysis.NlpAnalysis;
import org.ansj.splitWord.analysis.ToAnalysis;
import org.nlpcn.commons.lang.tire.domain.Forest;
import org.nlpcn.commons.lang.tire.domain.Value;
import org.nlpcn.commons.lang.tire.library.Library;

/**
 * Segment分词示例
 */
public class AnsjSegTest {

	public static void main(String[] args) {
		// nlpAnay("的卡死毛泽东阿尽快第三课杨悦彤啊实打实大家啊是的呢撒大实施计划大家啊是你的就撒啊实践活动那就是你的教案受打击看撒打撒");
		String content = "有俄罗斯国会议员，9号在社交网站推特表示，美国中情局前雇员斯诺登，已经接受委内瑞拉的庇护，不过推文在发布几分钟后随即删除。俄罗斯当局拒绝发表评论，而一直协助斯诺登的维基解密否认他将投靠委内瑞拉。　　俄罗斯国会国际事务委员会主席普什科夫，在个人推特率先披露斯诺登已接受委内瑞拉的庇护建议，令外界以为斯诺登的动向终于有新进展。　　不过推文在几分钟内旋即被删除，普什科夫澄清他是看到俄罗斯国营电视台的新闻才这样说，而电视台已经作出否认，称普什科夫是误解了新闻内容。　　委内瑞拉驻莫斯科大使馆、俄罗斯总统府发言人、以及外交部都拒绝发表评论。而维基解密就否认斯诺登已正式接受委内瑞拉的庇护，说会在适当时间公布有关决定。　　斯诺登相信目前还在莫斯科谢列梅捷沃机场，已滞留两个多星期。他早前向约20个国家提交庇护申请，委内瑞拉、尼加拉瓜和玻利维亚，先后表示答应，不过斯诺登还没作出决定。　　而另一场外交风波，玻利维亚总统莫拉莱斯的专机上星期被欧洲多国以怀疑斯诺登在机上为由拒绝过境事件，涉事国家之一的西班牙突然转口风，外长马加略]号表示愿意就任何误解致歉，但强调当时当局没有关闭领空或不许专机降落。";

		toAnay111(content);
	}

	// 关键词提取
	public static void toAnay111(String content) {
		KeyWordComputer kwc = new KeyWordComputer(5);
		String title = "维基解密否认斯诺登接受委内瑞拉庇护";
		Collection<Keyword> result = kwc.computeArticleTfidf(title, content);
		System.out.println(result);
	}

	/**
	 * 多用户词典(新增、删除)
	 */
	public static void moreUserDic() {
		// 多用户词典
		String str = "神探夏洛克这部电影作者.是一个dota迷";
		System.out.println(ToAnalysis.parse(str));
		// 两个词汇 神探夏洛克 douta迷
		Forest dic1 = new Forest();
		Library.insertWord(dic1, new Value("神探夏洛克", "define", "1000"));
		Forest dic2 = new Forest();
		Library.insertWord(dic2, new Value("dota迷", "define", "1000"));
		System.out.println(ToAnalysis.parse(str, dic1, dic2));

		System.out.println("-------删除dic1中的词");
		Library.removeWord(dic1, "神探夏洛克");
		System.out.println(ToAnalysis.parse(str, dic1, dic2));
	}

	// 低版本的jar包中适用 UserDefineLibrary
	// /**
	// * 动态增删词库
	// */
	// public static void dynamicWord(){
	// // 增加新词,中间按照'\t'隔开
	// UserDefineLibrary.insertWord("ansj中文分词", "userDefine", 1000);
	// Result result = ToAnalysis.parse("我觉得Ansj中文分词是一个不错的系统!我是王婆!");
	// System.out.println("增加新词例子:" + result);
	// // 删除词语,只能删除.用户自定义的词典.
	// UserDefineLibrary.removeWord("ansj中文分词");
	// result = ToAnalysis.parse("我觉得ansj中文分词是一个不错的系统!我是王婆!");
	// System.out.println("删除用户自定义词典例子:" + result);
	//
	// //将用户自定义词典清空
	// UserDefineLibrary.clear();
	// }

	/**
	 * 加载词典文件
	 */
	public static void localDic() {
		try {
			// 读的是根目录下的
			Forest rootForest = Library.makeForest("library/userLibrary.dic");
			System.out.println(rootForest.toMap());
			// 加载字典文件,取的是resource下的
			InputStream inputStream = AnsjSegTest.class.getResourceAsStream("/library/userLibrary.dic");
			Forest resoutceForest = Library.makeForest(inputStream);
			String str = "我觉得ansj中文分词是一个不错的系统!我是王婆!";
			Result result = ToAnalysis.parse(str, resoutceForest);// 传入forest
			List<Term> termList = result.getTerms();
			for (Term term : termList) {
				System.out.println(term.getName() + ":" + term.getNatureStr());
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 基本分词 基本就是保证了最基本的分词.词语颗粒度最非常小的..所涉及到的词大约是10万左右.
	 * 基本分词速度非常快.在macAir上.能到每秒300w字每秒.同时准确率也很高.但是对于新词他的功能十分有限
	 * @param content
	 */
	public static void baseAnay(String content) {
		Result result = BaseAnalysis.parse(delHTMLTag(content).replace("\n", "").replace(" ", "").replace("\t", ""));
		System.out.println("result:" + result);
	}

	/**
	 * 精准分词 它在易用性,稳定性.准确性.以及分词效率上.都取得了一个不错的平衡.
	 * @param content
	 */
	public static void toAnay(String content) {
		Result result = ToAnalysis.parse(content);
		System.out.println("result:" + result);
	}

	/**
	 * nlp分词(单条新闻处理7秒)
	 * 可以识别出未登录词.但是它也有它的缺点.速度比较慢.稳定性差.ps:我这里说的慢仅仅是和自己的其他方式比较.应该是40w字每秒的速度吧.
	 * 个人觉得nlp的适用方式.1.语法实体名抽取.未登录词整理.只要是对文本进行发现分析等工作 会把企业分开
	 * @param content
	 */
	public static void nlpAnay(String content) {
		Result result = NlpAnalysis.parse(delHTMLTag(content).replace("\n", "").replace(" ", "").replace("\t", ""));
		System.out.println("result:" + result);
		List<Term> terms = result.getTerms();
		for (Term term : terms) {
			String name = term.getName();
			String nature = term.getNatureStr();
			if (nature.equals("ns") || nature.equals("nr")) {
				System.out.println("------------------");
				System.out.println("getName:" + term.getName());
				System.out.println("getNatureStr:" + term.getNatureStr());
			}
		}
	}

	/**
	 * 筛除HTML标签
	 * @param htmlStr
	 * @return
	 */
	public static String delHTMLTag(String htmlStr) {
		String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
		String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; // 定义style的正则表达式
		String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式

		Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
		Matcher m_script = p_script.matcher(htmlStr);
		htmlStr = m_script.replaceAll(""); // 过滤script标签

		Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
		Matcher m_style = p_style.matcher(htmlStr);
		htmlStr = m_style.replaceAll(""); // 过滤style标签

		Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
		Matcher m_html = p_html.matcher(htmlStr);
		htmlStr = m_html.replaceAll(""); // 过滤html标签

		return htmlStr.trim(); // 返回文本字符串
	}

}
